Po raz pierwszt system plików /proc został włączony do 8-ej edycji Uniksa, a później do SVR4. W zamyśle miał zastąpić niewygodną funkcję ptrace dając dostęp do przestrzeni adresowej procesu, na której można byłoby działać jak na zwykłym pliku. System rozwinął się w elegancki interfejs do przestrzeni adresowej procesów.
Wczesne implementacje. We wczesnych implementacjach każdy proces reprezentowano jako plik w katalogu /proc. Nazwą pliku był pid procesu, rozmiarem - rozmiar przestrzeni adresowej procesu, prawami - prawa właściciela procesu. Na pliku można było wykonywać operacje read(), write(), lseek() i ioctl().
Zmiany w późniejszych impelemtacjach. Zmiany w implementacji były powodowane przede wszystim wprowadzeniem do Uniksa wielowątkowości na poziomiwe użytkownika (lwp - light weight process ). Każdy proces w systemie jest reprezentowany jako podkatalog katalogu /proc.
Nazwa | Tryb | Struktura (patrz procfs.h) | Informacje w pliku |
status | r | pstatus | Stan procesu. |
psinfo | r | psinfo | Informacje dla ps. |
ctl | w | - | Umożliwia wykonywnie operacji sterujących. |
map | r | zaw. prmap | Mapa adresów wirtualnych procesu. |
as (adress space) | rw | - | Przestrzeń wirtualna procesu. |
sigact | r | zaw. sigaction | Informacje związane z obsługą sygnałów. |
cred (credentials) | r | prcred | Informacja uwierzytelnijąca. |
object | kat. | - | Zawiera o jednym pliku dla każdego obiektu odwzorowywanego na przestrzeń adresową procesu. |
lwp | kat. | - | Zawiera informacje o wątkach - po jednym katalogu dla każdego wątku. Każdy taki katalog zawiera trzy pliki: lwpstatus, lwpsinfo oraz lwpctl (znaczenie analogiczne). |
Operacja na plikach ctl i lwpctl:
PCSTOP | Zatrzymuje wszystkie wątki. |
PCWSTOP | Czeka na zatrzymanie wszystkich wątków procesu. |
PCRUN | Wznawia zatrzymane procesy lekkie. |
PCKILL | Wysyła podany sygnał do procesu. |
PCSENTRY | Nakazuje zatrzymanie się wątku przy wejściu do określonych funkcji systemowych. |
PCSEXIT | Nakazuje zatrzymanie się wątku przy wyjściu z określonych funkcji systemowych. |
[ela@karamba /]$ ps PID TTY TIME CMD 13762 pts/6 00:00:00 bash 14065 pts/6 00:00:00 ps [ela@karamba /]$ ll /proc/13762 razem 0 -r--r--r-- 1 ela ela 0 sty 1 04:19 binfmt -r--r--r-- 1 ela ela 0 sty 1 04:19 cmdline lrwxrwxrwx 1 ela ela 0 sty 1 04:19 cwd -> /proc/ -r-------- 1 ela ela 0 sty 1 04:19 environ lrwxrwxrwx 1 ela ela 0 sty 1 04:19 exe -> /bin/bash* dr-x------ 2 ela ela 0 sty 1 04:19 fd/ -r--r--r-- 1 ela ela 0 sty 1 04:19 maps -rw------- 1 ela ela 0 sty 1 04:19 mem -r--r--r-- 1 ela ela 0 sty 1 04:19 mounts lrwxrwxrwx 1 ela ela 0 sty 1 04:19 root -> // -r--r--r-- 1 ela ela 0 sty 1 04:19 stat -r--r--r-- 1 ela ela 0 sty 1 04:19 statm -r--r--r-- 1 ela ela 0 sty 1 04:19 status [ela@karamba /]$ cat /proc/13762/cmdline /bin/bash
Pliki katalogu /proc nie są fizycznymi plikami z danymi. Operacje na tych plikach są tłumaczone na odpowiednie akcje podejmowane na procesach lub ich przestrzeniach adresowych. Wiele z tych plików jest interfejsem do pewnych struktur procesu, np. pstatus, które opsane są w pliku procfs.h.
Pseudosystem plików /proc jest bardzo użyteczny w szczególności w programach odpluskwiających i śledzących (dzięki plikom ctl).
Powstanie. Gdy w Uniksie był tylko jeden system plików, zaczęło powstawać bardzo wiele różnych rodzajów plików, w sczególności plików urządzeń. Powodowało to problemy z narzutem czasowym przy dostępie, narzutem pamięciowym (ten sam blok w dwóch cache'ach). Pseudosystem plików specfs, wprowadzony po raz pierwszy do SVR4, rozwiązał te problemy.
Interfejs urządzeń. System plików specfs udostępnia jednolity interfejs do urządzeń. System ten jest niewidoczny dla użytkowników i nie może być montowany. Eksportuje interfejs, który może być stosowany przez dowolny system plików wspierający pliki specjalne. Jego podstawowym zadaniem jest przechwycenie operacji we-wy do plikw urządzeń i przetłumaczenie ich na wywołania odpowiednich programów obsługi tych urządzeń.
Gdzie jest haczyk? Na pierwszy rzut oka wydaje się to ławtwym zadaniem - dla każdego pliku możemy sprawdzić czy jest on plikiem urządzenia i , jeśli tak, pobrać numery urządzenia. Wówczas możemy znaleźć podprogramy obsługi za pomoca tablic rozdzielczych urządzeń. Problemy pojawiają się, gdy z tym samym urządzeniem związanych jest wiele plikow urządzeń i korzysta z nich wielu użytkowników. Jądro musi wiedzieć, które vwęzły reprezentują to samo urządzenie.
Implementacja. Specfs tworzy v-węzeł przesłaniający (ang. shadow vnode) dla każdego pliku urządzenia. Jego dane w warstwie zależnej od systemu plików reprezentuje s-węzeł (ang. snode). Operacja wyszukiwania pliku urządzenia daje w wyniku wskaźnik do v-węzła przesłaniającego, a nie do węzła rzeczywistego. Węzeł rzeczywisty można uzyskać za pomocą operacji vop_realvp(). S-węzeł ma pole o nazwie s_commonvp, które wskazuje na węzeł wspólny dla tego urządzenia. Może na wiego wskazywać wiele węzłów, ale jednemu urządzeniu odpowiada jeden węzeł wspólny. Wszystkie operacje wymagające synchronizacji oraz odczyty i zapisy do urządzenia kierowane są przez węzeł wspólny.
System plików procesora (ang. Processor File System) udostępnia interfejs do poszczególnych procesów na komputerze wieloprocesorowym. Jest zamontowany w katalogu /system/processor i ma po jednym pliku dla każdego procesora. Nazwy plików są numerami procesorów, są tylko do odczytu. Zawierają następujące informacje:
Ponadto system plików procesora zawiera plik ctl, do którego może pisać tylko superużytkownik. Zapis do tego pliku powoduje wykonanie operacji sterujących na procesorze, np. odłączenie go.
Informacja o procesorze w Linuksie
[ela@karamba /]$ cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 6 model : 10 model name : AMD Athlon(tm) XP 2500+ stepping : 0 cpu MHz : 1830.035 cache size : 512 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow bogomips : 3643.80 |
Powstanie. System plików TFS (ang. Translucent File System (Półprzezroczysty)) powstał w Sun Microsystems. Celem było stworzenie systemu do współdzielenia plików bez duplikowania ich. System wspiera tworzenie dużego oprogramowania:
Współdzielony katalog. TFS implementuje warstwy projektu, każda warstwa jest fizycznym katalogiem. Warstwy są połączone w listę za pomocą plików ukrytych - dowiązań wyszukiwania (ang. search links). Pliki widoczne w katalogu TFS są sumą plików ze wszystkich warstw. Dodatkowo TFS umożliwia tworzenie warstw wariantowych, np. dla różnych platform.
Prywatne hierarchie. Każdy użytkownik może pobrać pliki z dowolnej warstwy. Domyślnie dostęp jest do najnowszej, zewnętrznej warstwy. Jeśli potrzebne są wcześniejsze warstwy, trzeba przejść jawnie po łańcuchu wyszukiwania. Gdy użytkownik zmodyfikuje plik w swojej hierarchii, zmiany stają się widoczne dla innych w momencie zapisania go do systemu plików (kopiowanie przy zapisie). Plik zostanie zapisany do najbardziej zewnęrznej warstwy, a warstwy niższe są chronione przed jakimkolwiek zapisem.
Wydajność. System TFS nie jest bardzo wydajny, gdyż pobranie pliku wymaga zwykle przeszukania kilku warstw. Aby przyspieszyć wyszukiwanie korzysta się z pamięci podręcznej.
Powstanie. System plików namefs został wprowaddzony do SVR4. Jego celem jest umożliwienie związania pliku z otwartym nazwanym strumieniem (ang. named STREAM) i sworzenie w ten sposób ,,kanału komunikacyjnego''.
Implementacja. Wprowadzono funkcję fattach(), która monutuje system namefs na pliku. Związuje się ,,głowę'' strumienia z punktem montowania, co pozwala przekierowywać operacje we-wy na pliku do strumienia.
Przykład. Za pomocą IP STREAM można implementować protokł TCP/IP lub UDP/IP.
Implementacja Gdy użytkownik próbuje się ,,dobrać'' do pliku, który jest łączem nazwanym, dochodzi do wywołania funkcji fifovp(), która zwraca v-węzeł systemu fifofs i odpowiednio inicjalizuje pole v_op na fifo_vnodeops.
Implementacja. System plików file descriptor filesystem, zwykle montowany na /dev/fd, jest wygodnym interfejsem do otwartych plikow (proces ma dostęp do swoich otwartych plików). Używa się tego głównie w językach skryptowych, np. bash, perl, awk, itd.
Przykład.
Dwa wywołania:
fd = open ("/dev/fd/n", mode);
fd = dup (n)
są identyczne.
Swapfs został wprowadzony do systemu operacyjnego Solaris, aby rozwiązać problem z nieużywaną pamięcią operacyjną (ponieważ każda strona pamięci miała mieć odpowiadającą stronę przestrzeni wymiany; problem powstawał, gdy przestrzeń wymiany była za mała).
System plików swapfs umożliwia zamontowanie wirtualnej przestrzeni wymiany, która obejmowała:
System plików Loopback File System tworzy wirtualny system pliów, którym można nakryć lub zduplikować pliki. Są one wówczas dostępne z obu ścieżek.