进程是系统分配资源的最小单位(这里说的资源是内存(准确的来说是进程的地址空间))
进程的特点:
1.并发性:
多任务操作系统支持多进程并发执行
2.交互性
可以和用户进行交互
3.异步性
用户可以在不关心进程如何运行时,发送指令后,就能得到想要的结果
4.动态性
进程有生死,有睡眠(阻塞),是动态存在的
5.独立性
多进程之间有自己独立的地址空间
隔离性好
程序和进程的区别:
程序:
程序是静态的一段代码
是一些保存在非易性存储器的指令的有序集合
没有任何执行的概念
进程:
是一个动态的概念
是程序执行的过程,包括动态创建,调度和消亡的整个过程。
它是资源分配的最小单元。
并发编程的核心:
1.程序执行的过程
CPU、总线、内存
三者如何执行指令见计算机组成原理
2.并发编程中的核心问题
多任务如何共享CPU
单核CPU
多核CPU
多任务如何共享内存(有操作系统)
默认有一份虚拟地址空间
多进程主要问题是如何共享一份虚拟地址空间
进程间切换:
主要是同一份虚拟地址空间的上下文切换
->保存上文
保存上一个进程的运行状态
->加载下文
加载下一个程序到内存中
进程上下文切换发生在以下几个情况中:
a进程执行完,b进程执行
a进程时间片到了,b进程执行
a进程被中断,优先执行b进程
CPU调度算法:
公平调度策略:
是按照时间片轮转的方法来实现多任务调度
抢占式任务调度:
有优先级,优先级即高的可以抢占优先级低的进程的执行资源。
Linux下进程的分类:
1.交互式进程
2.批处理进程
3.实时进程
进程的地址空间:
Linux操作系统采用的是虚拟内存管理技术,使得每个进程都有独立的地址空间。该地址空间是大小为4G的线性虚拟空间,用户所看到和接触到的都是该虚拟地址。无法看到实际的物理内存地址。利用这种虚拟地址不但更安全(用户不能直接访问物理内存),而且用户程序可以使用比实际物理内存更大的地址空间。
4GB的进程地址空间会被分成两个部分——用户空间与内核空间。用户地址空间是0~3G(0xC0000000),内核地址空间占据3-4GB。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间虚拟地址。只有用户进程使用系统调用(代表用户进程在内核态执行)时,才可以访问到内核空间。每当进程切换,用户空间就跟着变化;而内核空间是由内核负责用设,它并不会随着进程改变,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。每个进程的用户空间都是完全独立、互不相干的。
Linux,进程开辟个数的上线:
为了与老版本兼容,short int pid,32768
可以修改上线:
修改这个文件:/proc/sys/kernel/pid_max
Linux下进程的状态:
如何查看Linux 进程状态:
ps:静态查看进程信息
ps -aux
ps -ajx (SID)
top:动态查看活跃的进程信息
pstree:显示进程的父子关系/打印进程树
kill:给指定进程发送信号,查看Linux提供的信号
ps命令的输出内容:
PPID:父进程ID *
PID:进程ID *
PGID:进程组ID *
SID:会话组ID(会话期ID) *
TTY:终端 *
STAT:进程状态 *
进程状态,用下面的代码中的一个给出:
D 不可中断 Uninterruptible sleep (usually IO)
R 正在运行,或在队列中的进程
S 处于休眠状态
T 停止或被追踪
Z 僵尸进程
W 进入内存交换(从内核2.6开始无效)
X 死掉的进程
< 高优先级
N 低优先级
N 低优先级
L 有些页被锁进内存
s 包含子进程
+ 位于后台的进程组
l 多线程,克隆线程
UID:进程的用户ID
TIME:进程使用的总CPU时间
COMMAND:执行进程时的命令
USER:进程所有者
%CPU:进程自最近一次刷新以来所占用的CPU时间和总时间的百分比
%MEM:进程使用内存的百分比
VSZ:进程使用的虚拟内存大小,以K为单位
RSS:驻留空间的大小。显示当前常驻内存的程序的K字节数
START:进程的起始时间
NI 进程的优先级值,较小的数字意味着占用较少的CPU时间
PRI 进程优先级。
WCHAN 进程等待的内核事件名
Linux进程状态:
运行态
停止态
僵尸态
死亡态
阻塞态
可中断的阻塞态
不可中断的阻塞态
进程信息存在:/proc目录下
进程的创建
进程创建技术:
1.完美拷贝
几乎拷贝父进程的所有内容,除了父进程的PID,PCB信息
2.写时拷贝
开辟好进程基本管理信息后,共享父进程的数据和代码,只有
需要更改时,才拷贝
较为节省内存开销,所以用的较多
Linux 2.6版本之后,大多使用写时拷贝
fork:
/*需要包含的头文件*/
#include <unistd.h>
/*
*函数名:fork
*函数功能:创建子进程
*函数参数:void
*函数返回值:pid_t
* >0: 父进程,代表子进程的pid
* ==0: 子进程
* -1: fork失败
*/
pid_t fork(void);
vfork
clone
system:<在正式工作时,不建议使用,容易产生死锁>
/*需要包含的头文件*/
#include <stdlib.h>
/*
*函数名:system
*函数功能:fork一个子进程,执行一条shell指令
*函数参数:const char *command:指令内容
*函数返回值:int:见manual
*/
int system(const char * command);
sleep():
/*需要包含的头文件*/
#include <unistd.h>
/*
*函数名:sleep
*函数功能:让进程/线程睡眠指定的秒数
*函数参数:unsigned int seconds:指定睡眠的秒数
*函数返回值:unsigned int:成功返回sleep的时间,失败返回0
*/
unsigned int sleep(unsigned int seconds);
fork():
1.创建一个子进程
2.2.6以后用写时拷贝,之前用完美拷贝
3.子进程和父进程执行顺序不确定
4.有两个返回值,
>0:为父进程,返回值代表子进程的pid
==0:为子进程,返回值为0
vfork():
1.创建子进程,阻塞父进程
2.子进程先执行
3.使用的是写时拷贝
4.有两个返回值,
>0:为父进程,返回值代表子进程的pid
==0:为子进程,返回值为0
clone():
不管是fork()还是vfork(),底层实现都是clone()
该函数返回子进程的进程号,可以有选择性的拷贝
父进程的内容。
system():
fork() + execl()
创建一个进程,并执行一个shell命令
不建议执行耗时命令,容易产生死锁的情况
进程的执行
exec函数族:
一般用来执行程序,而不是程序员自己灵活编写的代码
要求执行的是可执行文件。
当判断是否为子进程时,直接写相应的代码
这种方式比较灵活
system
同execl,但容易发生死锁
exec x x:
l e
v p
第五位的选项:
l:命令行参数以枚举形式输入,包含命令本身,以NULL结尾
v:命令行参数以指针数组形式传入,即把list内容写入指针数组
第六位的选项:
e:在指定的位置中执行查找可执行文件
p:在系统环境变量中执行查找可执行文件
exec函数族只能执行指定的可执行文件,是一种不够灵活的执行特定任务
的方法,掌握 execve execlp就可以了
进程的销毁
exit:
调用退出处理函数
清理I/O缓冲区
_exit:
没有上述操作
获取进程表识:
#include <sys/types.h>
#include <unistd.h>
获取当前进程的pid
pid_t getpid(void);
获取父进程的pid
pid_t getppid(void);
标准IO缓冲区:
缓冲区的分类:
全缓冲:普通文件
行换成:stdin,stdout
无缓冲:stderr
ANSI C(C89)要求缓冲具有以下特点:
1.当且仅当标准输入和标准输出并不涉及交互设备时,它们才可以使用全缓冲。
这里并没有交代如果标准输入和标准输出涉及交互作用设备时,它们使用无缓冲还是行缓冲。
大多数系统默认使用下列类型的缓冲区:
1.标准错误是不带缓冲区的
2.如果涉及终端设备的流,则它们是行缓冲的
3.否则是全缓冲
注意:终端牵扯标准输入/输出流(stdin/stdout)
在我们使用的linux/ubuntu中:
全缓冲的大小为:4096 Byte
行缓冲的大小为:1024 Byte
如何验证全缓冲的大小:
原理:缓冲区存不下数据的时候,会刷新缓冲区(正常情况)
注意:为了避免进程退出刷新缓冲区,需要_exit()函数来做这件事情
或者使用while(1)还阻塞进程,防止进程退出(不建议使用,比较难理解)
例子:
#include <stdio.h>
#include <unistd.h>
int main()
{
FILE \*fp = NULL;
fp = fopen("a.txt","r+");
if(NULL == fp)
{
puts("open file error.");
return -1;
}
int i = 0;
//当缓冲区中的数据<=4096,在没有其他强制刷新的情况下,不会
//清空缓冲区,只有当缓冲区中的数据>4096个字符时,才会刷新
for(i = 0; i < 4096; i++)
{
fputc('a',fp);
}
\_exit(0);
}
输出结果:执行之后,a.txt没有写入数据
-rw-rw-r-- 1 farsight farsight 0 May 6 19:37 a.txt
上面的实验结果说明:缓冲区没有满,数据没有写入,也证明了大小为4096
#include <stdio.h>
#include <unistd.h>
int main()
{
FILE \*fp = NULL;
fp = fopen("a.txt","r+");
if(NULL == fp)
{
puts("open file error.");
return -1;
}
int i = 0;
//当缓冲区中的数据<=4096,在没有其他强制刷新的情况下,不会
//清空缓冲区,只有当缓冲区中的数据>4096个字符时,才会刷新
for(i = 0; i < 4200; i++)
{
fputc('a',fp);
}
\_exit(0);
}
输出结果:执行之后,a.txt写入数据,并且只写了缓冲大小个数据
-rw-rw-r-- 1 farsight farsight 4096 May 6 19:39 a.txt
如何验证行缓冲的大小:
原理:同全缓冲的原理
例子:
#include <stdio.h>
#include <unistd.h>
int main()
{
//当缓冲区中的数据<=1024,在没有其他强制刷新的情况下,不会
//清空缓冲区,只有当缓冲区中的数据>1024个字符时,才会刷新
int i = 0;
for(i = 0; i < 1024; i++)
{
fputc('a',stdout);
}
\_exit(0);
}
输出结果:
没有数据输出
#include <stdio.h>
#include <unistd.h>
int main()
{
//当缓冲区中的数据<=1024,在没有其他强制刷新的情况下,不会
//清空缓冲区,只有当缓冲区中的数据>1024个字符时,才会刷新
int i = 0;
for(i = 0; i < 1030; i++)
{
fputc('a',stdout);
}
\_exit(0);
}
输出结果:写入1024个数据
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
***93道网络安全面试题***
![](https://img-blog.csdnimg.cn/img_convert/6679c89ccd849f9504c48bb02882ef8d.png)
![](https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png)
![](https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png)
内容实在太多,不一一截图了
### 黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
😝朋友们如果有需要的话,可以联系领取~
#### 1️⃣零基础入门
##### ① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。
![image](https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)
##### ② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
![image-20231025112050764](https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)
#### 2️⃣视频配套工具&国内外网安书籍、文档
##### ① 工具
![](https://img-blog.csdnimg.cn/img_convert/d3f08d9a26927e48b1332a38401b3369.png#pic_center)
##### ② 视频
![image1](https://img-blog.csdnimg.cn/img_convert/f18acc028dc224b7ace77f2e260ba222.png#pic_center)
##### ③ 书籍
![image2](https://img-blog.csdnimg.cn/img_convert/769b7e13b39771b3a6e4397753dab12e.png#pic_center)
资源较为敏感,未展示全面,需要的最下面获取
![在这里插入图片描述](https://img-blog.csdnimg.cn/e4f9ac066e8c485f8407a99619f9c5b5.png#pic_center)![在这里插入图片描述](https://img-blog.csdnimg.cn/111f5462e7df433b981dc2430bb9ad39.png#pic_center)
##### ② 简历模板
![在这里插入图片描述](https://img-blog.csdnimg.cn/504b8be96bfa4dfb8befc2af49aabfa2.png#pic_center)
**因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**