作业:
1、创建子父进程,子进程将1.txt内容拷贝到2.txt中,父进程将3.txt内容拷贝到4.txt中。
2、创建子父进程,子进程拷贝文件的前一半,父进程拷贝后一半。
1、进程(process)
程序的一次执行过程就是进程。
1、进程概念:
时间片轮询 上下文切换。
1、进程1在3ms时间内运行结束,那么cpu会将进程1出队,继续询问进程2.
2、进程1需要8ms才能结束,那么cpu会在第5ms时将进程1,放入就绪队列尾部
3、进程1正好5ms运行结束cpu将进程1出队。
4、如果有外部优先级更高的事件打断进程1,进程1也会进入就绪队列等待。例如IO
2、进程内存管理
1、进程在创建时系统会从1G的物理内存中,通过mmu映射出4G的虚拟内存,其中0--3G的内存是所有进程的空间,进程间空间是独立的,但是3--4G的空间是内核空间,由所有进程共享。
2、注意在32位的操作系统中,1G物理内存映射出来4G虚拟内存,在64位的操作系统中,1G物理内存映射出来256T虚拟内存。
3、进程之间并不能直接进程数据交换,但是可以通过内核空间实现数据交换也就是进程间通信。
3、进程和程序区别
1、进程是动态的,随着程序的执行而创建,随着程序的结束而消亡。
2、程序是存储在内存的二进制文件,进程消亡程序并不会消失。
3、进程是动态,程序是静态。
4、进程种类
Linux系统中进程种类可以为三种:
1、交互进程,如vi编辑器,实现用户和主机之间的交流。
2、批处理进程,如gcc编译器的一步到位的编译,批处理进程将所有进程放入就绪队列,一次性全部运行结束。
3、守护进程,不受用户控制,不依赖于终端,随着系统的开启而开启,随着系统的关闭而消亡。
5、进程号
pid(process ID):当前进程的进程号。
ppid(parent process ID):父进程号。
每一个子进程都不会凭空产生,都由父进程创建而生(除了守护进程等伴随操作系统的特殊进程),
每一个子进程和其父进程都有自己的ID号,也就是进程号。
进入到该文件下:cd /proc/
可以查看操作系统中所有的进程号。
6、Linux下5个特殊进程
1、0号进程,又叫idel进程没有父进程,系统启动时创建的,维护系统运行,当系统内没有任何进程需要执行时运行0号进程,系统处于待机状态。
2、1号进程,又叫 init进程父进程就是0号进程,也被称为守护进程,当有子进程处于僵尸状态时,1号进程会为子进程收尸。
3、2号进程,又称为kthreadd进程,是调度进程,完成任务器各项任务的调度工作。
4、僵尸进程:父进程还在运行,但是子进程已经消亡,而父进程并没有回收子进程的资源,这时子进程就被称为僵尸进程。
5、孤儿进程:父进程已经消亡,但是子进程还在运行,此时子进程就被称为孤儿进程。
7、进程的shell指令(ps top kill pidof)
1、查看进程状态:ps -ajx
PPID:父进程进程号
PID:当前进程的进程号
PGID:当前进程组的进程号
TTY:如果是?表示不依赖于任何终端而运行。
STAT:进程的状态(S:可中断的休眠态,+:前台运行状态)
TIME:进程执行的时间 COMMAND:进程的名称。
2、查看进程的CPU占用率 ps -aux
USER :当前用户
%CPU:CPU占用率
%MEM:内存占用率
START:创建时间
3、进程之间的树状关系 pstree
4、查看进程间的关系 ps -ef
5、动态查看进程的状态 top
6、带颜色动态查看进程的状态 htop
7、查看进程的信号 kill -l
进程可以发送或者接收的信号号如下:
ubuntu@ubuntu:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
1) SIGHUP:终端要退出时向所有该终端下的进程发送的信号,表示我要退出了你们都得死。
2) SIGINT:进程终止信号 ctrl+c
3) SIGQUIT:用户按下了ctrl+\按键后发送的指令,进程退出。
9) SIGKILL:强制杀死某个进程,该信号不会被忽略或跳过
10) SIGUSR1:用来自定义的信号,主要用来捕获某个信号。
12) SIGUSR2:用来自定义的信号,主要用来捕获某个信号。
11) SIGSEGV:堆栈溢出或者指针异常访问内存,段错误(核心已转储)
14) SIGALRM:定时器时间到了内核向用户空间发送的信号。
17) SIGCHLD:子进程退出时向父进程发送的信号,表示儿子要死了。
18) SIGCONT:将暂停的进程继续运行。
19) SIGSTOP:内核发送给进程的暂停信号。
20) SIGTSTP:用户按下了ctrl+z键,暂停进程。
8、向进程发送信号指令 kill
发送信号:kill -信号号 进程ID
9、查看进程的状态:man ps
R+:正在前台运行的状态
S+:前台可中断的休眠态
进程的状态标识:
D uninterruptible sleep (usually IO) 不可中断的休眠态
R running or runnable (on run queue) 正在运行或者可运行状态
S interruptible sleep (waiting for an event to complete) 可中断的休眠态
T stopped by job control signal 暂停状态
t stopped by debugger during the tracing 代码调试中的暂停状态。
Z defunct ("zombie") process, terminated but not reaped by its parent 僵尸态 For BSD formats and when the stat keyword is used, additional characters may be displayed:
< high-priority (not nice to other users) 高优先级
N low-priority (nice to other users)低优先级
s is a session leader 会话组组长
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)多线程状态。
+ is in the foreground process group 前台状态
8、进程状态和切换
1、进程创建后进入就绪队列
2、通过CPU的时间片轮询,处于运行态
3、如果被外部事件如IO,中断,会处于阻塞状态。
4、解除阻塞状态后,会重新进入到就绪队列。
5、直至运行结束处于消亡态。
9、进程的创建
fork函数
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
功能:创建子进程,子父进程空间独立,在父进程中返回值时子进程的ID,在子进 程中返回值是0,创建子进程失败返回-1.
参数:无
返回值:在父进程中返回值时子进程的ID,在子进程中返回值是0,创建子 进程失败回-1。
10、写时拷贝技术
1、写时拷贝技术,当创建子进程后,子父进程空间在发生数据写操作时就独立。
2、子进程中对局部变量的操作不会影响到父进程,父进程中对局部变量的操作不会影响到子进程。
3、进程之间数据不共享。
1、讨论子父进程是否共享全局变量
fork之后子父进程独立运行,子进程拷贝了父进程的资源,所以子进程修改变量,不会影响到父进程内的变量。
2、是否共享局部变量
局部变量也不会共享。
getpid 和 getppid函数
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
功能:调用进程获取自己的ID号
参数:无
返回值:成功返回调用进程的ID,没有失败。
pid_t getppid(void);
功能:调用进程获取父进程的ID号
参数:无
返回值:成功返回调用进程父进程的ID,没有失败。
2、验证孤儿进场是否有父进程的ID
孤儿进程的父进程会变成1号进程。
exit 和 _exit 函数
#include <stdlib.h>
void exit(int status);
功能:进程退出函数,基于标准库,刷新缓冲区后退出。
参数:进程退出的状态:
EXIT_SUCCESS(0):成功退出
EXIT_FAIURE(1):失败退出:
返回值:无
#include <unistd.h>
void _exit(int status);
功能:进程退出函数,基于系统调用,不刷新缓冲区后退出。
参数:进程退出的状态:
EXIT_SUCCESS(0):成功退出
EXIT_FAIURE(1):失败退出
返回值:无
思维导图