Linux 计算机基础概论

本篇内容在前边复习+补充了上篇的内容,计算机基础概论可点击目录直达

复习上节

main.c

#include<stdio.h>
#include<math.h>

int main()
{
    double d=4.0;
    double r=sqrt(d);

    printf("r=%.2f\n",r);

    return 0;
}

用到了sqrt函数(-l库名)

gcc -o main main.c -lm

ldd main查看用到的库,man sqrt查看sqrt

ldd main
man sqrt

test.c

#include<stdio.h>
#include<math.h>

int main()
{
    double d=4.0;
    double r=d*2.0;

    printf("r=%.2f\n",r);

    return 0;
}

编译时直接

gcc -o test test.c

主函数

main.c

#include<stdio.h>
#include<stdlib.h>

//主函数的参数:argc 参数个数,参数内容,环境变量
int main(int argc,char* argv[],char* envp[])
{
    printf("argc=%d\n",argc);
    for(int i=0;i<argc;i++)
    {
        printf("argv[%d]=%s\n",i,argv[i]);
    }

    return 0;
}

编译

stu@stu-virtual-machine:~/Linux/day07$ gcc -o main main.c
stu@stu-virtual-machine:~/Linux/day07$ ./main
argc=1
argv[0]=./main
stu@stu-virtual-machine:~/Linux/day07$ ./main "hello" abc 123
argc=4
argv[0]=./main
argv[1]=hello
argv[2]=abc
argv[3]=123

打印环境变量path

法一
stu@stu-virtual-machine:~/Linux/day07$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
法二
stu@stu-virtual-machine:~/Linux/day07$ printf $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

main.c进阶

for循环打印环境变量

#include<stdio.h>
#include<stdlib.h>

//主函数的参数:argc 参数个数,参数内容,环境变量
int main(int argc,char* argv[],char* envp[])
{
    printf("argc=%d\n",argc);
    for(int i=0;i<argc;i++)
    {
        printf("argv[%d]=%s\n",i,argv[i]);
    }

    for(int i=0;envp[i]!=NULL;i++)
    {
        printf("envp[%d]=%s\n",i,envp[i]);
    }
    return 0;
}

加环境变量

stu@stu-virtual-machine:~/Linux/day07$ MYSTR="hello"
stu@stu-virtual-machine:~/Linux/day07$ ./main
argc=1
argv[0]=./main
envp[0]=SHELL=/bin/bash
 ......
envp[52]=OLDPWD=/home/stu/Linux
stu@stu-virtual-machine:~/Linux/day07$ export MYSTR
stu@stu-virtual-machine:~/Linux/day07$ ./main
argc=1
argv[0]=./main
envp[0]=SHELL=/bin/bash
.......
envp[30]=MYSTR=hello
......
envp[53]=_=./main

printf()

Linux常用exit(0)表示正常退出程序(man 3 exit)

sleep(man 3 sleep)

程序阻塞3s

终端:sleep 3

main中:sleep(3)

#include<unistd.h>

先打印hello,再阻塞3s

int main()
{
    printf("hello\n");
    sleep(3);
    exit(0);//退出进程
}

先阻塞3s,再打印hello

原因:hello还在缓冲区

int main()
{
    printf("hello");
    sleep(3);
    exit(0);//退出进程
}

解决方法:

1.强制刷新: \n fflush(stdout)

2.放满了

3.程序结束了 exit(0) 注:_exit(0)不打印

计算机基础概论

1.计算机的基本组成

1.1 计算机组成五大部件

(1) 运算器 :也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻辑运算,移位,比较等。

(2) 控制器 :它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算机按照预先规定的目标和步骤有条不紊地进行操作及处理。

(3) 存储器 :存储程序和各种数据。

(4) 输入设备 :把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信息存储起来。

(5) 输出设备 : 把计算机机能识别的信息转换为人能识别的信息,进行呈现。

一台计算机可以抽象成下图:

CPU 中包含控制器和运算器, 内存就是存储器。I/O 设备就是输入设备和输出设备,如:键盘、显示器、鼠标、硬盘、网卡

image-20211129211804201

1.2 系统总线

(1) 数据总线 :用来在各个功能部件中间传输数据,是双向传输总线。

(2) 地址总线 : 用来指出数据总线上的源数据或目的数据在主存单元的地址或 io 设备的地址。

(3) 控制总线 :由于各个连接在数据总线和地址总线的部件都是共享这两类总线的,那么在某一时刻由谁来使用,就是控制总线负责完成的。

1.3 指令

(1) 指令 :是指示计算机执行某种操作的命令。一条指令通常由两部分构成:地址码 和 操作码。

(2) 程序 : 由一条一条的指令构成。

(3) 指令周期 :cpu 每取出并执行一条指令所需的全部时间称为指令周期。

(4) 指令系统 :计算机能够执行的全部指令的集合称为该计算机的指令系统。

(5) RISC :精简指令系统计算机。

(6) CISC :复杂指令系统计算机。

(7) 程序与指令:高级语言 汇编助记符 机器指令

2.进程概论

(1) 进程:一个正在运行的程序。

(2) PCB : 即是进程控制块,是进程存在的唯一标志。用来描述进程的属性信息。

image-20211129212317903

(3) 进程状态: 就绪 、运行、阻塞

image-20211129212335859

(4) 并发与并行

image-20211129212350787

并行:是指两个或者多个事件在同一时刻发生

并发:是指两个或多个事件在同一时间间隔发生

3.内存管理

3.1 简单分页 逻辑页 物理页 页表

image-20211129212614409

页表存放逻辑页与物理页的对应关系

平时打印的地址是逻辑地址

磁盘 -> 内存 ->缓存 ->寄存器

空间大 速度快

3.2 虚拟内存

虚拟内存提供的三个重要的能力:

1) 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,根据需要在磁盘和主存之间来回传送数据,使得能够运行比内存大的多的进程。

2) 它为每个进程提供了一致的地址空间,从而简化了存储器管理

3) 它保护每个进程的地址空间不被其他进程破坏

4.操作系统发展史

操作系统:管理计算机上的软硬件资源,为用户提供一个交互的接口。

(1) 串行处理

(2) 批处理

(3) 多道程序设计

(4) 分时系统

Linux 进程复制与替换

复制进程 fork

fork 方法

#include<unistd.h>
pid_t fork(void)

函数返回类型 pid_t 实质是 int 类型,Linux 内核 2.4.0 版本的定义是:
fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。
pid_t pid的值 在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1。

fork.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>

int main()
{
    int n=0;
    char *s=NULL;

    pid_t id=fork();
    
    if(id==0)
    {
        n=3;
        s="child";
    }
    else
    {
        n=7;
        s="parent";
    }

    for(int i=0;i<n;i++)
    {
        printf("s=%s\n",s);
        sleep(1);
    }

    exit(0);
}

结果

s=parent
s=child
s=child
s=parent
s=child
s=parent
s=parent
s=parent
s=parent
s=parent

批注 2021-11-29 220730

fork.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>

int main()
{
    int n=0;
    char *s=NULL;

    pid_t id=fork();
    
    if(id==0)
    {
        n=3;
        s="child";
    }
    else
    {
        n=7;
        s="parent";
    }

    for(int i=0;i<n;i++)
    {
        printf("s=%s,pid=%d,ppid=%d\n",s,getpid(),getppid());
        sleep(1);
    }

    exit(0);
}

结果

stu@stu-virtual-machine:~/Linux/day07$ ./fork
s=parent,pid=3465,ppid=3023
s=child,pid=3466,ppid=3465
s=child,pid=3466,ppid=3465
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
s=child,pid=3466,ppid=3465
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
stu@stu-virtual-machine:~/Linux/day07$ ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
stu         3023    2218  0 20:35 pts/1    00:00:00 bash
stu         3467    3023  0 22:31 pts/1    00:00:00 ps -f

fork.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>

int main()
{
    int n=0;
    char *s=NULL;

    pid_t id=fork();
    
    if(id==0)
    {
        n=3;
        s="child";
    }
    else
    {
        n=7;
        s="parent";
    }

    for(int i=0;i<n;i++)
    {
        printf("s=%s,n=%d,&n=%x\n",s,n,&n);
        sleep(1);
    }

    exit(0);
}

结果

stu@stu-virtual-machine:~/Linux/day07$ ./fork
s=parent,n=7,&n=1fb1ad94
s=child,n=3,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=child,n=3,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=child,n=3,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值