linux内核 进程地址空间

大神:

     我是一个Linux内核菜鸟,在<<深入linux内核架构>>一书中写道:“各个进程的地址空间都是独立的”,
            ,大神, 我不理解进程的"地址空间"是什么, 是进程的内存吗,请赐教,不胜感激涕零。

6个回答

进程启动后,都有一块自己的私人空间,其它进程 不可以直接访问的 。基本上所有操作系统都是这样的,这是最基本的安全性。这里所说的地址空间 就是一系列的内存地址罢了。

图片说明

内容是从《程序员自我修养》中摘录的

首先,你要知道虚拟地址的存在。当系统启动之后呢,虚拟地址转换模块将被配置启用,这个模块一般叫MMU(Memory Map Unit),是一个硬件模块。启用之后,程序里所有的数据地址均为虚拟地址。虚拟地址需要经过该模块转换成物理地址后,才会用物理地址去内存中取数据。
至于转换的规则,可以是简单的一对一,也可以完全倒置,或者其他任意规则,这个规则是需要在启动该模块前,通过软件配置的。
然后,取一个地址的数据,并不是直接使用这个地址,而是通过起始地址+偏移地址来取数据(实际要更复杂,但是使用简单模型更容易理解)。比如访问地址0x1004处的数据,可以是 起始地址0x0 + 偏移地址0x1004 ,也可以是 0x1000+4 ,或者其他的组合。可以配置相关寄存器(如x86的段寄存器cs\ds\es\fs\gs等)的不同的值来指定不同的起始地址,而偏移地址可以简单理解为C语言里的指针。
明白这两点后,你的问题就可以解答了。
首先,系统给不同的进程分配了不同的内存段,这个段就是该进程的起始地址,储存在对应进程的信息中(可能是进程表什么的),当该进程被系统唤醒时,系统就会将这个起始地址加载到段寄存器中,然后该进程对内存的所有操作,都是基于该起始地址的。比如对于进程1,起始地址是0x0,那么当进程1访问0x0的数据,就会转换为0x0,送到MMU中转换为物理地址后,再取数据。而进程2,起始地址是0x100,当进程2访问0x0的数据时,就会转换为0x100,再经过MMU……。这样两个进程,虽然对同一个地址进行了取数据,但却是访问的不同地址的数据。
在段寄存器中,其实还有一些关于段长度以及访问权限的信息。当你的访问超过指定的长度时或者没有权限时,就会引发异常(由硬件产生),并调用系统的异常处理程序(可能会抛出一个段错误)。
所以说,进程的地址空间是独立的,其实是因为存在另一个东西,来区分这些“相同”的地址的空间的。

建议先看看操作系统原理的书。

进程分配有虚拟空间,程序访问的是这些空间,操作系统会通过页文件方式在虚拟内存和物理内存之间做映射。

# ## 谢谢你们,我正在好好的研究你们的赐教!谢谢开源,谢谢帮助 谢谢!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Linux 如何在内核空间获得目录文件,并遍历其内容?

在用户空间我们可以用DIR ,dirent,遍历目录文件内容, 内核空间该怎么做呢?

linux内核堆栈切换问题

假设每个进程有自己的页目录和页表。。用户进程运行时如果发生了中断。就会从特权级 3切换到特权级0。cpu此时自动从tss里面获取到esp0,ss0,并将cs,eip,eflags自动压入栈, 但此时的页目录还未切换,虽然已经进入内核栈空间,但此时经过页映射,物理地址还在 进程空间,linux是怎样实现当中断发生时,不破坏进程空间里面的值来切换到内核栈的? 注意,我说的不是0.xx的内核。。。整个CPU只用到了一个tss.

关于linux内核线程的使用

linux虚拟机中启动一个内核线程,在线程中打印以下信息: - 执行系统调用的进程的ID号 - 分行打印系统中所有内核线程的信息:线程ID、父进程ID、运行状态、名称、用户ID。 每一行打印一个内核线程的信息。 要求在上面,新学的只会创建和结束内核线程,但是具体怎么实现打印这些信息不会。 请教前辈们,如何去实现这个打印的功能,拜求。

linux为什么把内核空间划到高1G而不是低1G

求各位解答,linux为什么一定要把内核空间划分到进程空间的高1G呢? 可不可以这样划分进程空间:0-1G是内核空间,1-4G是用户空间。

求助,关于Linux0.11内核进程切换的问题

如何只修改调度函数schedule,让进程0和进程1严格交替输出信息。操作系统作业,愁死了![图片](https://img-ask.csdn.net/upload/201703/03/1488549499_442755.png)![图片](https://img-ask.csdn.net/upload/201703/03/1488549504_422306.png)

Linux如何管理内核的数据段?

我目前知道的或自以为知道的(以32位Linux、3G+1G的配置为例): 1. Linux里的每个进程都有4G的地址空间,其中0至3G是用户空间,3G至4G是内核。内核被共享在每个进程的地址空间中。 2. 每个进程的地址空间内大约有4个段,即内核代码段、内核数据段、用户代码段、用户数据段。 3. 我以为属于内核的物理内存,是不能被交换(swap)到硬盘上的,也就是常驻在内存中的。 但是我现在在看一篇文献,上面大约这样说: ...上面提到的那种设计不好(注:具体这个设计是什么就不讨论了),因为物理内存页会频繁地在属于kernel data segment和属于user space之间切换。而属于kernel code segment的物理内存页则没有这个问题。 这好像和我之前理解的不符啊?求高手解惑:kernel data segment的物理页如何变成user space的物理页?以及user space的物理页如何变成kernel data segment的物理页?

内核程序跳转内核空间的某个函数或者跳转用户空间某个函数的过程

运行在内核的程序,如果想调用其他内核程序,是否可以直接跳转到这个程序函数函数所在的地址(假设已经知道了目标函数的地址)? 内核程序访问用户地址空间的程序,能否直接跳转,有什么保护或者检查机制吗?

Linux内核可以访问数据库么?

是这样的:我对每个新建的文件,调用sys_open时,在内核中同时给该文件在数据库中建立一个对应的表。 ,比如a.txt 文件给其建立一个一个aa表,然后我给a.txt文件存储写数据的时候,对这些数据进行一个切分 ,将这些切分的数据作为aa表的字段,进行插入操作。 我的问题是:内核可以这样做么?内核可以直接操作数据库么?接口是什么?比如mysal数据库,或者还是内核不能直接访问数据库,那需要做什么才可以让内核访问数据库呢?

关于Linux内核看门狗的疑问

在内核源码中,Linux内核看门狗线程的调度策略是SCHED_FIFO,而我自己的内核模块中调度策略默认为SCHED_NORMAL,按理说FIFO比NORMAL的优先级要高,可为什么我自己模块中的死循环还是让看门狗饿死了,求解释。

linux内核模块调用内核中的函数

我编写了一个简单的内核模块,想验证一下内核workqueue的功能。 如下: ``` #include <linux/module.h> #include <linux/init.h> #include <linux/workqueue.h> #include <linux/sched.h> #include <linux/nsproxy.h> //static struct workqueue_struct *queue=NULL; //extern int copy_namespaces(unsigned long flags, struct task_struct *tsk); static struct work_struct work; static void work_handler(struct work_struct *data) { struct task_struct *base_task = find_task_by_vpid(18572); printk(KERN_ALERT"work handler function.\n"); printk(KERN_ALERT"current--------> %d.\n", current->pid); //copy_namespaces(CLONE_NEWUTS, current); get_nsproxy(base_task->nsproxy); switch_task_namespaces(current, base_task->nsproxy); } static int __init test_init(void) { //queue=system_unbound_wq //create_singlethread_workqueue("hello world");/*创建一个单线程的工作队列*/ //if (!queue) // goto err; INIT_WORK(&work,work_handler); queue_work(system_unbound_wq, &work); return 0; } static void __exit test_exit(void) { //destroy_workqueue(queue); printk(KERN_ALERT "caoshufeng module exit"); } MODULE_LICENSE("GPL"); module_init(test_init); module_exit(test_exit); ``` 这是makefile: obj-m += queue.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 模块make成功,但是无法insomd dmesg中有如下错误: [ 9806.426471] queue: Unknown symbol switch_task_namespaces (err 0) [ 9806.426554] queue: Unknown symbol find_task_by_vpid (err 0) 我已经include了相应的头文件,为啥还是找不到symbol呢?

关于Linux内核中通过hash表将pid转化为task_struct地址的计算

内核中通过hash表把pid快速转化为task_struct的地址,Linux内核中有4张hash表,在初始化期间会为4张hash表动态分配地址。但转化的计算问题中,《深入理解Linux内核》中提出,对于一个有512MB RAM系统,每张表就存储在4个页框中,每张表可以有2048个表项,不知道这个是如何计算而来的。

关于Linux内核简单编写问题

在添加最简单的Linux内核模块时,编译kello.c,代码如下: #include <linux/module.h> // for printk() int kello_init( void ) { printk( "\n Hello, students from SDUST! This is in kernel space! \n" ); return 0; } void kello_exit( void ) { printk( "\n Goodbye now... students from SDUST! \n" ); } MODULE_AUTHOR("SDUSTOS <fangs99@126.com>"); MODULE_LICENSE("GPL"); module_init(kello_init); module_exit(kello_exit); 在int kello_init()中为什么一定要return 0?

关于linux内核使用第三方库

想在内核源码中写入一个模块,因为会用到高精度的数字,所以会使用一些第三方库,但是不知道怎么在内核make的时候引入这些第三方库。

linux内核态程序并行执行

如题,内核态程序能并行执行吗?比如同时写多个io或者socket? 它是怎样工作的 相关的博文推荐下呗? 谢谢!!!

在linux内核源码中添加用户自定义的函数

本人刚接触linux不久,想在linux内核中加入自己定义的is_accepted_sd()函数。我在sd_ops().h头文件中声明了自定义的函数,并在sd_ops.c源文件中定义和实现。然后在sd.c源文件中的mmc_sd_init_card()函数中调用了这个自定义的函数。(PS:sd.c中有sd_ops.h这个头文件) 然后我进行编译,结果编译报错。错误如下所示: drivers/built-in.o: In function `mmc_sd_init_card': /opt/FriendlyARM/tiny210/android/linux-2.6.35.7/drivers/mmc/core/sd.c:379: undefined reference to `is_accepted_sd' make: *** [.tmp_vmlinux1] Error 1 真心求各位大神不吝赐教啊~~我把仅剩的2个C币都贡献出去了。

嵌入式设备linux内核版本的选择

各位大侠好: 小弟目前打算搭建一个嵌入式平台针对嵌入式设备,采用ARM处理器,是选择2.X内核版本好还是3.X内核版本好?两者的区别大吗?以前做项目主要使用的是2.6.X内核版本,多谢!

Linux内核编程实验三。。。。。

问题 A 使用ITIMER_REAL型定时器实现一个gettimeofday(),将它设置为每秒产生一个信号, 并计算已经经过的秒数。 问题 B 使用以上实现的 gettimeofday()实现一个精确到微秒级的“闹钟”。 问题 C 实现以上一个父进程和两个子进程并发递归计算不同项数的fibonacci序列的程序, 分析每个进程三种类型定时器测出的时间关系。 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <time.h> //for time() #include <sys/time.h> //for itimeval #include <sys/types.h> //for pid_t #include <sys/wait.h> //for waitpid void psig_real(int signum); //父进程3个信号处理函数 void psig_virtual(int signum); void psig_prof(int signum); void c1sig_real(int signum); //子进程1的3个信号处理 void c1sig_virtual(int signum); void c1sig_prof(int signum); void c2sig_real(int signum); //子进程2的3个信号处理 void c2sig_virtual(int signum); void c2sig_prof(int signum); long fibonacci(unsigned int n); //求斐波那契 //记时变量 long p_real_secs=0,c1_real_secs=0,c2_real_secs=0; long p_virtual_secs=0,c1_virtual_secs=0,c2_virtual_secs=0; long p_prof_secs= 0,c1_prof_secs=0, c2_prof_secs=0; //计时器结构体 struct itimerval p_realt, c1_realt, c2_realt; struct itimerval p_virtt, c1_virtt, c2_virtt; struct itimerval p_proft, c1_proft, c2_proft; //part A的信号处理 void psig_real_gettime(int signum) { p_real_secs += 1; } //实现具有gettimeofday功能 ,接收一个函数 void mygettimeofday(unsigned int i,long (*timefunction)(unsigned int)) { signal(SIGALRM,psig_real_gettime); p_realt.it_value.tv_sec = 0; //0 sec p_realt.it_value.tv_usec = 999999; //999999 usec p_realt.it_interval.tv_sec = 0; p_realt.it_interval.tv_usec = 999999; setitimer(ITIMER_REAL,&p_realt,NULL); timefunction(i); getitimer(ITIMER_REAL,&p_realt); printf("cost time %ld Sec : %ld Msec\n", p_real_secs, (999999 - p_realt.it_value.tv_usec) / 1000); } int wakeupme = 0; //part B闹钟 void dealalarm(int signum) //闹钟处理函数 { wakeupme = 1; } int main(int argc,char **argv) { long fib = 0, microsecond; pid_t pid1, pid2; int msecond, usecond; struct timeval tv; if(argv[1][0] == '-' && argv[1][1] == 'a' && argc == 3) { printf("-----PART A-----\n"); mygettimeofday(atoi(argv[2]),fibonacci); return 0; } else if(argv[1][0] == '-' && argv[1][1] == 'b') { printf("-----PART B-----\n"); struct timeval tv; gettimeofday(&tv, NULL); struct tm *tmptime; tmptime = localtime(&tv.tv_sec); printf("now time > %d-%d-%d %d:%d:%d:%d:%d\n",tmptime->tm_year+1900,tmptime->tm_mon+1,tmptime->tm_mday,tmptime->tm_hour,tmptime->tm_min,tmptime->tm_sec,(int)tv.tv_usec/1000,(int)tv.tv_usec%1000); struct tm inputtime; int year, month, day, hour, minute, second; printf("set alarm : "); scanf("%d-%d-%d %d:%d:%d:%d:%d",&year,&month,&day,&hour, &minute,&second,&msecond,&usecond); inputtime.tm_year = year - 1900; inputtime.tm_mon = month - 1; inputtime.tm_mday = day; inputtime.tm_hour = hour; inputtime.tm_min = minute; inputtime.tm_sec = second; inputtime.tm_isdst = 0; inputtime.tm_wday = 0; inputtime.tm_yday = 0; microsecond = mktime(&inputtime) * 1000000 + msecond * 1000 + usecond; microsecond -= tv.tv_sec * 1000000 + tv.tv_usec; signal(SIGALRM,dealalarm); p_realt.it_value.tv_sec = microsecond / 1000000; p_realt.it_value.tv_usec = microsecond % 1000000; p_realt.it_interval.tv_sec = 0; p_realt.it_interval.tv_usec = 0; setitimer(ITIMER_REAL,&p_realt,NULL); while(!wakeupme); printf("wake time > %d-%d-%d %d:%d:%d:%d:%d\n",inputtime.tm_year+1900,inputtime.tm_mon+1,inputtime.tm_mday,inputtime.tm_hour,inputtime.tm_min,inputtime.tm_sec,msecond,usecond); return 0; } else if(argv[1][0] == '-' && argv[1][1] == 'c' && argc == 5) { printf("-----PART C-----\n"); //bind signal and function for parent process signal(SIGALRM,psig_real); signal(SIGVTALRM,psig_virtual); signal(SIGPROF,psig_prof); //init parent process 3 timer p_realt.it_interval.tv_sec = 9; p_realt.it_interval.tv_usec = 999999; p_realt.it_value.tv_sec = 9; p_realt.it_value.tv_usec = 999999; setitimer(ITIMER_REAL,&p_realt,NULL); p_virtt.it_interval.tv_sec = 9; p_virtt.it_interval.tv_usec = 999999; p_virtt.it_value.tv_sec = 9; p_virtt.it_value.tv_usec = 999999; setitimer(ITIMER_VIRTUAL,&p_virtt,NULL); p_proft.it_interval.tv_sec = 9; p_proft.it_interval.tv_usec = 999999; p_proft.it_value.tv_sec = 9; p_proft.it_value.tv_usec = 999999; setitimer(ITIMER_PROF,&p_proft,NULL); pid1 = fork(); if(pid1==0) { //bind signal and function for child1 process signal(SIGALRM,c1sig_real); signal(SIGVTALRM,c1sig_virtual); signal(SIGPROF,c1sig_prof); //init child1 process 3 timer c1_realt.it_interval.tv_sec = 0; c1_realt.it_interval.tv_usec = 999999; c1_realt.it_value.tv_sec = 0; c1_realt.it_value.tv_usec = 999999; setitimer(ITIMER_REAL,&c1_realt,NULL); c1_virtt.it_interval.tv_sec = 0; c1_virtt.it_interval.tv_usec = 999999; c1_virtt.it_value.tv_sec = 0; c1_virtt.it_value.tv_usec = 999999; setitimer(ITIMER_VIRTUAL,&c1_virtt,NULL); c1_proft.it_interval.tv_sec = 0; c1_proft.it_interval.tv_usec = 999999; c1_proft.it_value.tv_sec = 0; c1_proft.it_value.tv_usec = 999999; setitimer(ITIMER_PROF,&c1_proft,NULL); //get fibonacci fib = fibonacci(atoi(argv[2])); //get child1 3 time and fibnacci printf("Child1 fib = %ld\n", fib); getitimer(ITIMER_REAL,&c1_realt); printf("Child1 Real Time = %ld Sec : %ld Msec\n", c1_real_secs + 9-c1_realt.it_value.tv_sec,(999999-c1_realt.it_value.tv_usec)/1000); getitimer(ITIMER_VIRTUAL,&c1_virtt); printf("Child1 Virtual Time = %ld Sec : %ld Msec\n",c1_virtual_secs + 9-c1_virtt.it_value.tv_sec,(999999-c1_virtt.it_value.tv_usec)/1000); getitimer(ITIMER_PROF,&c1_proft); printf("Child1 Prof Time = %ld Sec : %ld Msec\n",c1_prof_secs + 9-c1_proft.it_value.tv_sec,(999999-c1_proft.it_value.tv_usec)/1000); exit(0); } else if((pid2=fork()) == 0) { //bind signal and function for child2 process signal(SIGALRM,c2sig_real); signal(SIGVTALRM,c2sig_virtual); signal(SIGPROF,c2sig_prof); //init child2 process 3 timer c2_realt.it_interval.tv_sec = 9; c2_realt.it_interval.tv_usec = 999999; c2_realt.it_value.tv_sec = 9; c2_realt.it_value.tv_usec = 999999; setitimer(ITIMER_REAL,&c2_realt,NULL); c2_virtt.it_interval.tv_sec = 9; c2_virtt.it_interval.tv_usec = 999999; c2_virtt.it_value.tv_sec = 9; c2_virtt.it_value.tv_usec = 999999; setitimer(ITIMER_VIRTUAL,&c2_virtt,NULL); c2_proft.it_interval.tv_sec = 9; c2_proft.it_interval.tv_usec = 999999; c2_proft.it_value.tv_sec = 9; c2_proft.it_value.tv_usec = 999999; setitimer(ITIMER_PROF,&c2_proft,NULL); //get fibonacci fib = fibonacci(atoi(argv[3])); //get child2 3 time and fibnacci printf("Child2 fib = %ld\n", fib); getitimer(ITIMER_REAL,&c2_realt); printf("Child2 Real Time = %ld Sec : %ld Msec\n",c2_real_secs+9-c2_realt.it_value.tv_sec,(999999-c2_realt.it_value.tv_usec)/ 1000); getitimer(ITIMER_VIRTUAL,&c2_virtt); printf("Child2 Virtual Time = %ld Sec : %ld Msec\n",c2_virtual_secs+9-c2_virtt.it_value.tv_sec,(999999-c2_virtt.it_value.tv_usec)/1000); getitimer(ITIMER_PROF,&c2_proft); printf("Child2 Prof Time = %ld Sec : %ld Msec\n",c2_prof_secs+9-c2_proft.it_value.tv_sec,(999999-c2_proft.it_value.tv_usec)/ 1000); exit(0); } else { //get fibonacci fib = fibonacci(atoi(argv[4])); //print parent 3 time and fibnacci printf("Parent fib = %ld\n", fib); getitimer(ITIMER_REAL,&p_realt); printf("Parent Real Time = %ld Sec : %ld Msec\n", p_real_secs + 9 - p_realt.it_value.tv_sec, (999999 - p_realt.it_value.tv_usec) / 1000); getitimer(ITIMER_VIRTUAL,&p_virtt); printf("Parent Virtual Time = %ld Sec : %ld Msec\n", p_virtual_secs + 9 - p_virtt.it_value.tv_sec, (999999 - p_virtt.it_value.tv_usec) / 1000); getitimer(ITIMER_PROF,&p_proft); printf("Parent Prof Time = %ld Sec : %ld Msec\n", p_prof_secs + 9 - p_proft.it_value.tv_sec, (999999 - p_proft.it_value.tv_usec) / 1000); //wait child process waitpid(pid1,NULL,0); waitpid(pid2,NULL,0); } } } //parent process signal function void psig_real(int signum) { p_real_secs += 10; } void psig_virtual(int signum) { p_virtual_secs += 10; } void psig_prof(int signum) { p_prof_secs += 10; } //child1 process signal function void c1sig_real(int signum) { c1_real_secs += 10; } void c1sig_virtual(int signum) { c1_virtual_secs += 10; } void c1sig_prof(int signum) { c1_prof_secs += 10; } //child2 process signal function void c2sig_real(int signum) { c2_real_secs += 10; } void c2sig_virtual(int signum) { c2_virtual_secs += 10; } void c2sig_prof(int signum) { c2_prof_secs += 10; } //get fibonacci by n long fibonacci(unsigned int n) { if(n == 1 || n == 2) return 1; return fibonacci(n-1)+fibonacci(n-2); } 题目要求和代码如上,在Ubuntu上编译运行后报段错误,请问该如何修改?

如何将linux用户空间的一段已分配内存映射到内核空间

如何将linux用户空间的一段内存(已分配)映射到内核空间,使得在内核访问用户时不用复制数据而直接访问数据 请问能不能给出具体的代码演示功能的实现呢? 万分感谢大家!!!!

linux内核模块依赖问题

最近修改内核源码,发现模块A的编译过程中,模块A需要依赖模块B和模块C 在编译模块时,A.mod.o的文件中也明确有这一条 depends=bb,cc,dd 那么请问,**在编译过程中**,是在那个地方记录了这个依赖关系?

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

Linux面试题(2020最新版)

文章目录Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和DOS之间的基本区别是什么?Linux 开机启动过程?Linux系统缺省的运行级别?Linux 使用的进程间通信方式?Linux 有哪些系统日志文件?Linux系统安装多个桌面环境有帮助吗?什么是交换空间?什么是root帐户什么是LILO?什...

Linux命令学习神器!命令看不懂直接给你解释!

大家都知道,Linux 系统有非常多的命令,而且每个命令又有非常多的用法,想要全部记住所有命令的所有用法,恐怕是一件不可能完成的任务。 一般情况下,我们学习一个命令时,要么直接百度去搜索它的用法,要么就直接用 man 命令去查看守冗长的帮助手册。这两个都可以实现我们的目标,但有没有更简便的方式呢? 答案是必须有的!今天给大家推荐一款有趣而实用学习神器 — kmdr,让你解锁 Linux 学习新姿势...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

史上最全的 python 基础知识汇总篇,没有比这再全面的了,建议收藏

网友们有福了,小编终于把基础篇的内容全部涉略了一遍,这是一篇关于基础知识的汇总的文章,请朋友们收下,不用客气,不过文章篇幅肯能会有点长,耐心阅读吧爬虫(七十)多进程multiproces...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

85后蒋凡:28岁实现财务自由、34岁成为阿里万亿电商帝国双掌门,他的人生底层逻辑是什么?...

蒋凡是何许人也? 2017年12月27日,在入职4年时间里,蒋凡开挂般坐上了淘宝总裁位置。 为此,时任阿里CEO张勇在任命书中力赞: 蒋凡加入阿里,始终保持创业者的冲劲,有敏锐的...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

新一代神器STM32CubeMonitor介绍、下载、安装和使用教程

关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang最近ST官网悄悄新上线了一款比较强大的工具:STM32CubeMonitor V1.0.0。经过我研究和使用之...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

大学一路走来,学习互联网全靠这几个网站,最终拿下了一把offer

大佬原来都是这样炼成的

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

什么时候跳槽,为什么离职,你想好了么?

都是出来打工的,多为自己着想

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

立即提问
相关内容推荐