输入设备、存储器(指的是内存)、运算器、控制器、输出设备
注意:外设包括输入设备和输出设备,外设是相对于内存和CPU说的。所有设备都只能直接和内存访问,CPU能且只能对内存进行读写(在不考虑缓存的情况下),不能访问外设(输入或输出设备)。体系结构规定CPU只能从内存中读取。所以程序运行必须加载到内存中。(为了提高计算效率)
请描述,从你登录上QQ开始和某位朋友聊天开始,数据的流动过程。
打开登录QQ程序,实际上是把QQ程序加载到内存中,CPU在执行QQ程序的代码
键盘–内存–CPU–网卡及 显示器-----网络-----网卡–内存–CPU–显示器
如果是发文件呢?
磁盘–内存–CPU–网卡及 显示器-----网络-----网卡–内存–CPU–显示器及磁盘
简称OS,是一个进行软硬件管理的软件。通过合理的软硬件资源管理为用户提供良好的执行环境。
硬件管理:计算机底层的硬件是以冯诺依曼体系结构互相连接的。
软件管理:进程管理、文件系统、内存管理、驱动管理等。
课程主要讲进程管理和文件系统,讲一点点内存管理(这个很难),驱动管理(网卡驱动、磁盘驱动、显示器驱动等)不讲。
操作系统是通过被管理对象的数据进行管理,和底层硬件接触拿到对应的数据,执行用户命令。管理者(OS),执行者(驱动),被管理者(硬件)。
OS的方法就是先描述,再组织。先用面向对象的思路描述所有被管理对象,再用数组结构把它们组织在一起。会提供操作系统接口。
linux操作系统是用c语言写的,所以操作系统接口就是C式接口。
用户进行指令操作或者编程操作,通过shell外壳、C/C++lib、界面等操作接口,来完成系统接口的调用。
一个运行起来的(加载到内存)的程序是进程。
先描述:PCB(Process Control Block),进程控制块。
struct task_struct{
某进程的所有属性,比如进程ID、优先级、状态、调度;
...
某进程对应的代码和属性地址;
struct task_struct* next;
};
再组织:链表数据结构。
所谓的进程管理,其实就是对PCB进行相关的管理(修改状态、优先级等),不是直接操作进程。就相当于对链表进行增删查等操作。
struct task_struct
是内核结构体,用来创建内核对象,操作系统把内核对象和程序、数据关联起来。故进程=内核数据结构+进程对应的磁盘代码。
ps ajx | head -1 #能把进程的标题行显示出来
[yyq@VM-8-13-centos 2022_12_08_Process]$ ps ajx | head -1
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
ps ajx | grep "name" #精确查找某程序的进程
[yyq@VM-8-13-centos 2022_12_08_Process]$ ps ajx | grep "test"
25852 2395 2395 25852 pts/0 2395 S+ 1001 0:00 ./test
2508 3797 3796 2508 pts/1 3796 S+ 1001 0:00 grep --color=auto test
ps ajx | head -1 && ps ajx | grep 'test' #组合使用带标题的某程序进程栏
[yyq@VM-8-13-centos 2022_12_08_Process]$ ps ajx | head -1 && ps ajx | grep 'test'
25852 2395 2395 25852 pts/0 2395 S+ 1001 0:00 ./test
2508 3797 3796 2508 pts/1 3796 S+ 1001 0:00 grep --color=auto test
kill -9 进程ID/PID #结束进程,PID是进程的编号
[yyq@VM-8-13-centos 2022_12_08_Process]$ kill -9 2395
我是一个进程
我是一个进程
我是一个进程
我是一个进程
Killed
进程再调度运行的时候,进程就具有动态属性!
getpid()
是与进程有关的系统调用函数,在2号手册。
进程每次被加载到内存中,都会有一个新的ID。
proc
[yyq@VM-8-13-centos 2022_12_08_Process]$ ls /proc/
1 1464 21 25832 3196 647 acpi fs meminfo swaps
10 14795 211 25851 32147 648 buddyinfo interrupts misc sys
108 14921 2125 25852 35 649 bus iomem modules sysrq-trigger
11 14949 22 259 36 65 cgroups ioports mounts sysvipc
11001 14998 23 26 37 654 cmdline irq mtrr timer_list
11239 1535 2332 267 38 657 consoles kallsyms net timer_stats
12 1541 2395 268 387 658 cpuinfo kcore pagetypeinfo tty
13 1542 24 27 4 7 crypto keys partitions uptime
1323 16 25 270 46 8 devices key-users sched_debug version
1324 18 2505 28 48 898 diskstats kmsg schedstat vmallocinfo
1369 18168 2507 283 49 9 dma kpagecount scsi vmstat
14 19 2508 29 50 924 driver kpageflags self xpmem
14107 2 252 292 51 989 execdomains loadavg slabinfo zoneinfo
1443 20 256 293 6 992 fb locks softirqs
14569 2068 257 30998 622 9972 filesystems mdstat stat
[yyq@VM-8-13-centos 2022_12_08_Process]$ ls /proc/2395
attr coredump_filter gid_map mountinfo oom_score sched statm
autogroup cpuset io mounts oom_score_adj schedstat status
auxv cwd limits mountstats pagemap sessionid syscall
cgroup environ loginuid net patch_state setgroups task
clear_refs exe map_files ns personality smaps timers
cmdline fd maps numa_maps projid_map stack uid_map
comm fdinfo mem oom_adj root stat wchan
#当2395号进程被kill,这个目录就进不去了
[yyq@VM-8-13-centos 2022_12_08_Process]$ ll /proc/4228/
total 0
dr-xr-xr-x 2 yyq yyq 0 Dec 9 08:55 attr
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 autogroup
-r-------- 1 yyq yyq 0 Dec 9 08:55 auxv
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 cgroup
--w------- 1 yyq yyq 0 Dec 9 08:55 clear_refs
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 cmdline
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 comm
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 coredump_filter
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 cpuset
lrwxrwxrwx 1 yyq yyq 0 Dec 9 08:55 cwd -> /home/yyq/linux-class/2022_12_08_Process
-r-------- 1 yyq yyq 0 Dec 9 08:55 environ
lrwxrwxrwx 1 yyq yyq 0 Dec 9 08:55 exe -> /home/yyq/linux-class/2022_12_08_Process/test #注意这里指示了源文件的路径
dr-x------ 2 yyq yyq 0 Dec 9 08:55 fd
dr-x------ 2 yyq yyq 0 Dec 9 08:55 fdinfo
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 gid_map
-r-------- 1 yyq yyq 0 Dec 9 08:55 io
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 limits
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 loginuid
dr-x------ 2 yyq yyq 0 Dec 9 08:55 map_files
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 maps
-rw------- 1 yyq yyq 0 Dec 9 08:55 mem
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 mountinfo
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 mounts
-r-------- 1 yyq yyq 0 Dec 9 08:55 mountstats
dr-xr-xr-x 5 yyq yyq 0 Dec 9 08:55 net
dr-x--x--x 2 yyq yyq 0 Dec 9 08:55 ns
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 numa_maps
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 oom_adj
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 oom_score
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 oom_score_adj
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 pagemap
-r-------- 1 yyq yyq 0 Dec 9 08:55 patch_state
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 personality
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 projid_map
lrwxrwxrwx 1 yyq yyq 0 Dec 9 08:55 root -> /
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 sched
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 schedstat
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 sessionid
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 setgroups
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 smaps
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 stack
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 stat
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 statm
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 status
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 syscall
dr-xr-xr-x 3 yyq yyq 0 Dec 9 08:55 task
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 timers
-rw-r--r-- 1 yyq yyq 0 Dec 9 08:55 uid_map
-r--r--r-- 1 yyq yyq 0 Dec 9 08:55 wchan
如果一个程序已经运行起来了(已经被加载到内存中了),一个exe指向的源文件被删除(rm -f /home/yyq/linux-class/2022_12_08_Process/test
),某些进程无需依赖其他的进程仍能运行,大部分进程可能会崩溃不能运行。
#include
#include
getpid() #获得进程ID
getppid() #获得父进程ID
fork() #创建子进程,函数执行前只有一个父进程,执行后是父进程+子进程,fork后的代码会被父进程和子进程共享
函数会返回0给子进程,返回子进程ID给父进程,创建失败则返回-1,故使用fork通常会加上if判断
父进程ID不变,因为父进程是bash。在命令行启动的进程,没有特殊情况下,一般该进程的父进程都是bash。
[yyq@VM-8-13-centos 2022_12_08_Process]$ ll /proc/2508
total 0
lrwxrwxrwx 1 yyq yyq 0 Dec 9 08:46 exe -> /usr/bin/bash
通过fork
可以完成并发式编程。多进程多线程很常见!