1. 进程 线程
进程: 程序的一次运行
程序 ----- 进程
程序:
都是 可执行程序
windows下:*.exe
linux 下: ELF
进程 由程序转换过来的
程序---加载到内存--->进程
人 ---- 人生
---------------------------
进程 理解成计算机 世界中的"人"
--------------------------------
程序的组成:
代码段 数据段 --- 冯诺依曼 VS 哈佛体系结构
|text|data|bss|
size ./a.out
text data bss dec hex filename
1499 272 8 1779 6f3 ../6-day/a.out
进程的组成:
text | data | bss | 堆 栈 | 系统数据|
(malloc)
程序: 磁盘上 静态
进程: 内存中 动态
进程号:PID(process id) ---唯一表示一个进程
linux如何去描述一个进程(编程的角度)
struct task_struct
{
}
描述一个进程相关信息:
pid
ppid(Parent Process ID) 父进程id号
linux下进程的命令:
who
ps
//进程的状态:
D uninterruptible sleep (usually IO) //不可中断 的 睡眠态(等待态)
R running or runnable (on run queue) //执行态 或者 是就绪态
S interruptible sleep (waiting for an event to complete) //可中断的睡眠态
T stopped, either by a job control signal or because it is being traced. //停止态--(中止态)--暂停态
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent.
//僵尸态 --死亡啦,但是没有被父进程收尸
//
//
top 命令: 类似于 Windows下 "任务管理器"
top -p [pid] 查看某个进程的状态信息
kill 给对应的进程发信号:
kill -l //查看系统中的信号列表
kill -19 [pid] //发停止信号
kill -18 [pid] //发恢复信号
----------------------------------------------------
命令:
[1]. 只能看到进程的某一时刻的信息(快照)
ps -ef | grep 程序名 //查看进程的 信息 主要 pid 和 ppid 号
ps aux | grep 程序名 //查看进程的状态信息
[2].
top //动态的查看进程的信息
top -p [pid] //-p 表示指定 pid号
[3].kill 命令
kill 给对应的进程发信号:
kill -l //查看系统中的信号列表
kill -19 [pid] //发停止信号
kill -18 [pid] //发恢复信号
kill -9 [pid] //杀死进程
killall -9 [程序名] //杀死 "程序名"指定的进程
[4].pstree
查看进程的关系
pstree -sp [pid] //查看 指定的pid的进程的关系
练习:
自己写个死循环,通过命令查看进程的pid 状态信息 发信号暂停程序,
恢复程序和结束程序
进程的生命周期:
[1].诞生
[2].进程执行
[3].进程结束
1.进程的诞生
[1].fork() // fork 叉子
注:
fork创建子进程的过程
[1].通过复制调用fork的进程 来实现新进程的创建
新进程是调用进程的复制品
新进程被称为 "子进程"
原先的调用进程 称为 "父进程"
[2].复制了哪些东西?
a.原先进程中有哪些东西?
|text | data | bss | 堆 栈 | 系统数据|
复制之后:
新的进程获得了一份原先进程的组成的各个部分
|text | data | bss | 堆 栈 | 系统数据|
b.梳理:
代码段 和 数据段
c.拷贝了一些寄存器的值
pc (Program Counter) //指向下一条要执行的指令
#include <unistd.h>
pid_t fork(void);
返回值:
成功 在父进程 中返回子进程的pid
在子进程 中返回0
失败 -1 &errno
注意:
1.fork 之后父子进程的运行顺序,不确定的 ,是有操作系统决定的
2.父子进程是独立的地址空间,相互之间不会有影响!
全局变量
静态变量 static
局部变量
--------------
栈上
堆上--->malloc
练习:
分别定义上面不同的变量,赋值进程进行不同的操作,观察结果
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
pid_t pid; //pid_t <==>int
pid = fork(); //创建子进程 --- pc 程序计数器
// 创建子进程时,子进程也拷贝了父进程的pc值
// 指向了fork之后的下一条语句
// 此处 fork 之后的下一句为
// 赋值语句
// 将:fork的返回值赋值给pid变量
if(pid < 0) //出错处理
{
perror("fork fail");
return -1;
}
if(pid > 0) // 父进程执行的代码部分
{
// while(1)
{
printf("father pid = %d ppid = %d\n",getpid(),getppid());
sleep(1);
}
} else if(pid == 0) // 子进程执行的代码部分
{
// while(1)
{
printf("child pid = %d ppid = %d\n",getpid(),getppid());
// sleep(1);
}
}
printf("fork test\n"); //这句话 在没有 上面的while(1)时 会打印两次 ,一次是在父进程中
//一次是在 子进程中
//
return 0;
}
进程: 程序的一次运行
程序 ----- 进程
程序:
都是 可执行程序
windows下:*.exe
linux 下: ELF
进程 由程序转换过来的
程序---加载到内存--->进程
人 ---- 人生
---------------------------
进程 理解成计算机 世界中的"人"
--------------------------------
程序的组成:
代码段 数据段 --- 冯诺依曼 VS 哈佛体系结构
|text|data|bss|
size ./a.out
text data bss dec hex filename
1499 272 8 1779 6f3 ../6-day/a.out
进程的组成:
text | data | bss | 堆 栈 | 系统数据|
(malloc)
程序: 磁盘上 静态
进程: 内存中 动态
进程号:PID(process id) ---唯一表示一个进程
linux如何去描述一个进程(编程的角度)
struct task_struct
{
}
描述一个进程相关信息:
pid
ppid(Parent Process ID) 父进程id号
linux下进程的命令:
who
ps
//进程的状态:
D uninterruptible sleep (usually IO) //不可中断 的 睡眠态(等待态)
R running or runnable (on run queue) //执行态 或者 是就绪态
S interruptible sleep (waiting for an event to complete) //可中断的睡眠态
T stopped, either by a job control signal or because it is being traced. //停止态--(中止态)--暂停态
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent.
//僵尸态 --死亡啦,但是没有被父进程收尸
//
//
top 命令: 类似于 Windows下 "任务管理器"
top -p [pid] 查看某个进程的状态信息
kill 给对应的进程发信号:
kill -l //查看系统中的信号列表
kill -19 [pid] //发停止信号
kill -18 [pid] //发恢复信号
----------------------------------------------------
命令:
[1]. 只能看到进程的某一时刻的信息(快照)
ps -ef | grep 程序名 //查看进程的 信息 主要 pid 和 ppid 号
ps aux | grep 程序名 //查看进程的状态信息
[2].
top //动态的查看进程的信息
top -p [pid] //-p 表示指定 pid号
[3].kill 命令
kill 给对应的进程发信号:
kill -l //查看系统中的信号列表
kill -19 [pid] //发停止信号
kill -18 [pid] //发恢复信号
kill -9 [pid] //杀死进程
killall -9 [程序名] //杀死 "程序名"指定的进程
[4].pstree
查看进程的关系
pstree -sp [pid] //查看 指定的pid的进程的关系
练习:
自己写个死循环,通过命令查看进程的pid 状态信息 发信号暂停程序,
恢复程序和结束程序
进程的生命周期:
[1].诞生
[2].进程执行
[3].进程结束
1.进程的诞生
[1].fork() // fork 叉子
注:
fork创建子进程的过程
[1].通过复制调用fork的进程 来实现新进程的创建
新进程是调用进程的复制品
新进程被称为 "子进程"
原先的调用进程 称为 "父进程"
[2].复制了哪些东西?
a.原先进程中有哪些东西?
|text | data | bss | 堆 栈 | 系统数据|
复制之后:
新的进程获得了一份原先进程的组成的各个部分
|text | data | bss | 堆 栈 | 系统数据|
b.梳理:
代码段 和 数据段
c.拷贝了一些寄存器的值
pc (Program Counter) //指向下一条要执行的指令
#include <unistd.h>
pid_t fork(void);
返回值:
成功 在父进程 中返回子进程的pid
在子进程 中返回0
失败 -1 &errno
注意:
1.fork 之后父子进程的运行顺序,不确定的 ,是有操作系统决定的
2.父子进程是独立的地址空间,相互之间不会有影响!
全局变量
静态变量 static
局部变量
--------------
栈上
堆上--->malloc
练习:
分别定义上面不同的变量,赋值进程进行不同的操作,观察结果
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
pid_t pid; //pid_t <==>int
pid = fork(); //创建子进程 --- pc 程序计数器
// 创建子进程时,子进程也拷贝了父进程的pc值
// 指向了fork之后的下一条语句
// 此处 fork 之后的下一句为
// 赋值语句
// 将:fork的返回值赋值给pid变量
if(pid < 0) //出错处理
{
perror("fork fail");
return -1;
}
if(pid > 0) // 父进程执行的代码部分
{
// while(1)
{
printf("father pid = %d ppid = %d\n",getpid(),getppid());
sleep(1);
}
} else if(pid == 0) // 子进程执行的代码部分
{
// while(1)
{
printf("child pid = %d ppid = %d\n",getpid(),getppid());
// sleep(1);
}
}
printf("fork test\n"); //这句话 在没有 上面的while(1)时 会打印两次 ,一次是在父进程中
//一次是在 子进程中
//
return 0;
}